#include <iostream>
#include <vector>
using namespace std;
//按值传递  按地址传递  按引用传递

// int test(int &&temp)
// {
//     cout << "&&:" << temp << endl;
//     return 0;
// }

template <typename T>
void func(T t)          //按值传递:变量丢cv属性，指针保存cv,引用丢弃并丢cv属性
//void func(T *t)       //按指针传递：保存cv属性
//void func(T &t)       //按引用传递：保存变量和引用的cv属性
//void func(T &&t)      //万能引用（未定义引用）: 保存cv属性
//引用折叠：&& && ---&&   & &&--&
{
    //test(std::move(t));
    test(std::forward<int &&>(t));
}


int main(int argc, char **argv)
{
    /* 按值传递 */
    int num = 10;
    const int count = 20;
    /* 按指针传递 */
    int *p = &num;
    const int *pcount = &count;
    /* 按引用传递 */
    int &lnum = num;
    const int &lcount = count;
    
    func(10);

    func(num);    // int  :   T -->int
    func(count);  //const int;  T--->?

    func(p);      //int *:  T -->int *
    func(pcount); //const int * T-->? 

    func(lnum);
    func(lcount);    
    return 0;
}

